package commons.io.in;

import algo_lignes_sites.params.Params_ls;
import commons.data.Attributes;
import commons.data.Model;
import commons.utils.primitive_geom.Point_d;
import commons.utils.UtilsCalcul;
import commons.errors.ErrorsHandler;
import commons.logs.Logger;
import java.util.ArrayList;

public class File_in_Segment extends File_in {

	//**************************************************************************
	//** Variables specifiques au fichier de segments devant etre generalises
	//**************************************************************************
	public Model model_fusion; //sera créé lors de la fusion
//	public ArrayList<String> vFieldFusion; // liste des fields de fusion
	public ArrayList<Attributes> vAttributes_fusion;

	public File_in_Segment(String nomFichier, ArrayList<String> vLigne) {
		super (nomFichier, vLigne);
		typeCouche = TypeCouche.LIN;
	}


	// Affecte aux objets un attributes "fusion" contenant un sous ensemble des attributs initiaux
	// Appelé avant une fusion des segments du File_in_Segment
	public void fusionneAttributes(Params_ls params) {
		// On commence par créer un modèle fusionné
		model_fusion = model_in.createModelFusionne(params.vChampFusionLine);

		// puis on crée des Attributes correspondant au modèle fusionné :
		//  il contiendront un nombre restreint des attributs initiaux
		vAttributes_fusion = new ArrayList<Attributes>(vAttributes_in.size());
		for (int i = 0; i < vAttributes_in.size(); i++) {
			Attributes attr_in = vAttributes_in.get(i);
			vAttributes_fusion.add(attr_in.createAttributeFusionne (model_fusion));
		}

		for (int i = 0; i < vObj.size(); i++) {
			Segment_in seg = (Segment_in) vObj.get(i);
			// Remarque, createAttributeFusionne() est déjà optimisé pour éviter les
			//  calculs en doublons : on va bien récupérer les attributes fusionnés créés à l'étape précédente
			seg.attributes_fusion = seg.getAttributes_in().createAttributeFusionne(model_fusion);
		}
	}

	// idem v02
	public void addSegments_from_tabCoord_v03(String[] tabCoords, Attributes attr_in, int numLine) {
		addSegments_from_tabCoord_v02(tabCoords, attr_in, numLine);
	}
	// En v02, tabCoords représente une série de points qui se suivent (= path au sens d'ESRI) -> pas de doublon de coordonnées comme en v01
	public void addSegments_from_tabCoord_v02(String[] tabCoords, Attributes attr_in, int numLine) {
		assert(tabCoords.length >=4); // testé par l'appelant
		assert(tabCoords.length %2 == 0); // testé par l'appelant

		try {
			double x1, y1, x2, y2;
			x2 = Double.parseDouble(tabCoords[0]);
			y2 = Double.parseDouble(tabCoords[1]);

			x2 = UtilsCalcul.round(x2, nbChiffrePrecision);
			y2 = UtilsCalcul.round(y2, nbChiffrePrecision);

			for (int i = 2; i < tabCoords.length - 1; i += 2) {
				x1 = x2;
				y1 = y2;
				x2 = Double.parseDouble(tabCoords[i]);
				y2 = Double.parseDouble(tabCoords[i + 1]);

				x2 = UtilsCalcul.round(x2, nbChiffrePrecision);
				y2 = UtilsCalcul.round(y2, nbChiffrePrecision);

				if (x1 == x2 && y1 == y2) {
					Logger.log_WARN("Segment vide rejeté : ligne n° " + (numLine+1));
					continue;
				}

				vObj.add(new Segment_in(new Point_d(x1, y1), new Point_d(x2, y2), attr_in));
			}
		} catch (NumberFormatException numberFormatException) {
			ErrorsHandler.addError("Coordonnées dans le mauvais format à la ligne n° " + (numLine+1));
			return;
		}
	}

	
	public void addSegments_from_tabCoord_v01(String[] tabCoords, Attributes attr_in) {
		for (int i = 0; i < tabCoords.length-3 ; i+=4) {
			double x1 = Double.parseDouble(tabCoords[i].replace(',', '.'));
			double y1 = Double.parseDouble(tabCoords[i+1].replace(',', '.'));
			double x2 = Double.parseDouble(tabCoords[i+2].replace(',', '.'));
			double y2 = Double.parseDouble(tabCoords[i+3].replace(',', '.'));

			x1 = UtilsCalcul.round(x1, nbChiffrePrecision);
			y1 = UtilsCalcul.round(y1, nbChiffrePrecision);
			x2 = UtilsCalcul.round(x2, nbChiffrePrecision);
			y2 = UtilsCalcul.round(y2, nbChiffrePrecision);

			if (x1==x2 && y1==y2) {
				Logger.log_WARN("Segment vide rejeté");
				continue;
			}

			vObj.add (new Segment_in (new Point_d(x1, y1), new Point_d(x2, y2), attr_in));

		}
	}

	@Override
	public void printStatsGlobalesSpecifiques() {
		Logger.log_INFO2("  - Nb segments : " + vAttributes_in.size());
	
	}


}
